var PicResize = new Class.create();
PicResize.prototype = {
    pics_org: []
    , pics_resized: []
    , targetW: 0
    , targetH: 0

    //白边参数
    , spaceLeft: 0
    , spaceRight: 0
    , spaceTop: 0
    , spaceBottom: 0
    , offsetLeft: 0
    , offsetRight: 0
    , offsetTop: 0
    , offsetBottom: 0

    //是否裁剪
    , cutToFit: true

    , canvas: undefined
    , ctx: undefined

    , setCut: function (cut) {
        this.cutToFit = cut
    }
    , initialize: function (selector, _this, CBFunc) {
        this.canvas = document.getElementById('firstCanvas');
        // this.canvas = $("canvas")
        this.ctx = this.canvas.getContext('2d');
        let that = this
        $("#" + selector).on('change', function () {
            that.reset()
            for (var n in this.files) {
                console.log(n)
                if (n == 'length') {
                    continue
                }
                if (n == 'item') {
                    continue
                }
                let file = this.files[n];
                console.log(file)
                // let URL = window.URL || window.webkitURL;
                // let blob = URL.createObjectURL(file);
                let blob = that.createBlob(file)
                console.log(blob)
                var img = new Image();
                img.src = blob;
                that.pics_org = that.pics_org.concat(blob)
                img.onload = function (URL) {
                    that._compress(_this, CBFunc, this)
                }
            }
        });


    }
    , createBlob: function (data) {

        let URL = window.URL || window.webkitURL;
        let blob = URL.createObjectURL(data);
        return blob
    }

    //
    // , pickAndResize: function (_this, CBFunc, num) {
    //     let that = this
    //     $(selector + ' input:file').localResizeIMG({
    //         width: width,
    //         quality: quality,
    //         success: function (result) {
    //             var img = new Image();
    //             img.src = result.base64;
    //             // CBFunc(result.base64)
    //             // Page.pics.push(result.base64)
    //
    //             that.pics_org = that.pics_org.concat(result.base64)
    //             img.onload = function () {
    //
    //                 that._compress(_this, CBFunc, this)
    //             }
    //         },
    //         before: function () {
    //
    //         }
    //     });
    //
    // }
    , _compress: function (_this, CBFunc, img) {
        let that = this;
        console.log(this);

        let offsetLeft, offsetRight, offsetTop, offsetBottom
        $("#firstCanvas").attr({
            width: this.targetH,
            height: this.targetW
        }).attr({
            width: this.targetW,
            height: this.targetH
        });

        this.ctx = this.canvas.getContext('2d');
        if (this.pics_org.length > this.pics_resized.length) {

            //---------利用canvas压缩图片--------------
            var ratio = 2;
            let canvasWidth = img.width //图片原始长宽
            let canvasHeight = img.height
            let targetWidth = this.targetW;
            let targetHeight = this.targetH;
            let sx = 0;
            let sy = 0;
            // let spaceLeft = 100;
            // let offsetLeft;

            //----------绘制图形并取出图片路径--------------
            let destWidth = 0;
            let destHeight = 0;

            console.log(img.width);
            console.log(img.height);
            if (img.width > img.height) {
                let tmp = targetHeight;
                targetHeight = targetWidth;
                targetWidth = tmp;

                // _this.setData({canvasWidth: targetWidth, canvasHeight: targetHeight})

                $("#firstCanvas").attr({
                    width: targetWidth,
                    height: targetHeight
                }).attr({
                    width: targetHeight,
                    height: targetWidth
                });

                this.ctx = this.canvas.getContext('2d');

                // this.ctx.setFillStyle("#FFFFFF")
                this.ctx.fillStyle = ("#FFFFFF")
                this.ctx.fillRect(0, 0, targetWidth * 2, targetHeight * 2)
                // this.ctx.translate(targetWidth / 2, targetHeight / 2)
                this.ctx.translate(targetHeight / 2, targetWidth / 2)
                console.log("旋转")
                this.ctx.rotate(90 * Math.PI / 180)
                // this.ctx.translate(-targetHeight / 2, -targetWidth / 2)
                this.ctx.translate(-targetWidth / 2, -targetHeight / 2)
                if (this.cutToFit) {
                    //裁剪的情况
                    if (targetWidth / targetHeight < canvasWidth / canvasHeight) {
                        //原照片的宽度超标按照高度为基准计算宽度
                        canvasWidth = Math.trunc(canvasHeight * targetWidth / targetHeight);
                        sy = 0;
                        sx = Math.trunc((img.width - canvasWidth) / 2);
                        console.log(111)
                    } else {
                        //原照片的高度超标按照宽度为基准计算高度
                        canvasHeight = Math.trunc(canvasWidth * targetHeight / targetWidth);
                        sy = Math.trunc((img.height - canvasHeight) / 2);
                        sx = 0;
                    }

                    // offsetLeft = this.spaceLeft * canvasWidth / targetWidth
                    // offsetRight = this.spaceRight * canvasWidth / targetWidth
                    // offsetTop = this.spaceTop * canvasHeight / targetHeight
                    // offsetBottom = this.spaceBottom * canvasHeight / targetHeight
                    offsetLeft = this.spaceLeft * canvasWidth / targetHeight
                    offsetRight = this.spaceRight * canvasWidth / targetHeight
                    offsetTop = this.spaceTop * canvasHeight / targetWidth
                    offsetBottom = this.spaceBottom * canvasHeight / targetWidth

                    // 旋转后一直以竖直的方向为左右，不考虑画面
                    // let spaceLeftReal = spaceTop / targetH * targetHeight
                    // let spaceTopReal = spaceRight / targetW * targetWidth
                    // let spaceRightReal = spaceBottom / targetH * targetHeight
                    // l et spaceBottomReal = spaceLeft / targetW * targetWidth

                    //如果考虑画面请用线面的计算方式
                    // let spaceLeftReal = this.spaceLeft / this.targetH * targetHeight
                    // let spaceTopReal = this.spaceTop / this.targetW * targetWidth
                    // let spaceRightReal = this.spaceRight / this.targetH * targetHeight
                    // let spaceBottomReal = this.spaceBottom / this.targetW * targetWidth

                    let spaceLeftReal = this.spaceLeft / this.targetW * targetHeight
                    let spaceTopReal = this.spaceTop / this.targetH * targetWidth
                    let spaceRightReal = this.spaceRight / this.targetW * targetHeight
                    let spaceBottomReal = this.spaceBottom / this.targetH * targetWidth

                    // offsetLeft = 0
                    // offsetRight = 0
                    // offsetTop = 0
                    // offsetBottom = 0


                    // console.log(sx + offsetLeft);
                    // console.log(sy + offsetTop);
                    // console.log(canvasWidth - offsetLeft - offsetRight);
                    // console.log(canvasHeight - offsetTop - offsetBottom);
                    // console.log(0 + spaceLeftReal);
                    // console.log(0 + spaceTopReal);
                    // console.log(targetHeight - spaceLeftReal - spaceRightReal);
                    // console.log(targetWidth - spaceTopReal - spaceBottomReal);

                    this.ctx.drawImage(img
                        , sx + offsetLeft, sy + offsetTop
                        , canvasWidth - offsetLeft - offsetRight, canvasHeight - offsetTop - offsetBottom
                        , spaceTopReal, spaceLeftReal
                        , targetWidth - spaceTopReal - spaceBottomReal
                        , targetHeight - spaceLeftReal - spaceRightReal
                    )
                    // this.ctx.drawImage(img
                    //     , 0, 0
                    //     , 200, 200
                    //     , 0, 0
                    //     , 200, 200
                    // )

                } else {
                    //不裁剪的情况
                    if (targetWidth / targetHeight > canvasWidth / canvasHeight) {
                        //原照片的高度超标按照高度为基准计算宽度
                        canvasWidth = Math.trunc(canvasHeight * targetWidth / targetHeight);
                        sy = 0;
                        sx = Math.trunc((img.width - canvasWidth) / 2);
                        console.log(111)
                    } else {
                        //原照片的宽度超标按照宽度为基准计算高度
                        canvasHeight = Math.trunc(canvasWidth * targetHeight / targetWidth);
                        sy = Math.trunc((img.height - canvasHeight) / 2);
                        sx = 0;
                    }
                    this.ctx.drawImage(img
                        , sx, sy
                        , canvasWidth, canvasHeight, 0, 0, targetHeight, targetWidth)
                }


                destWidth = targetHeight
                destHeight = targetWidth
            } else {
                // _this.setData({canvasWidth: targetWidth, canvasHeight: targetHeight})
                $("#firstCanvas").attr({
                    width: targetHeight,
                    height: targetWidth
                }).attr({
                    width: targetWidth,
                    height: targetHeight
                });

                this.ctx = this.canvas.getContext('2d');

                // this.ctx.setFillStyle("#FFFFFF")
                this.ctx.fillStyle = ("#FFFFFF")
                this.ctx.fillRect(0, 0, targetWidth * 2, targetHeight * 2)
                //这里需要根据裁剪的边框尺寸重新计算图片尺寸以最大化显示图片内容，由于客户太JB丑我就不给他做了，毫米差距肉眼不可见

                if (this.cutToFit) {

                    offsetLeft = this.spaceLeft * canvasWidth / targetWidth
                    offsetRight = this.spaceRight * canvasWidth / targetWidth
                    offsetTop = this.spaceTop * canvasWidth / targetWidth
                    offsetBottom = this.spaceBottom * canvasWidth / targetWidth


                    if (targetWidth / targetHeight < canvasWidth / canvasHeight) {
                        //原照片的宽度超标按照高度为基准计算宽度
                        canvasWidth = Math.trunc(canvasHeight * targetWidth / targetHeight);
                        sx = Math.trunc((img.width - canvasWidth) / 2);
                        sy = 0;
                    } else {
                        //原照片的高度超标按照宽度为基准计算高度
                        canvasHeight = Math.trunc(canvasWidth * targetHeight / targetWidth);
                        sx = 0;
                        sy = Math.trunc((img.height - canvasHeight) / 2);
                    }

                    this.ctx.drawImage(img
                        , sx + offsetLeft, sy + offsetTop
                        //, sx, sy //在不修改裁剪区域的情况下图片略微有些拉伸
                        , canvasWidth - offsetLeft - offsetRight, canvasHeight - offsetTop - offsetBottom
                        , 0 + this.spaceLeft, 0 + this.spaceTop
                        , targetWidth - this.spaceLeft - this.spaceRight, targetHeight - this.spaceTop - this.spaceBottom)
                } else {
                    if (targetWidth / targetHeight > canvasWidth / canvasHeight) {
                        //原照片的宽度超标按照高度为基准计算宽度
                        canvasWidth = Math.trunc(canvasHeight * targetWidth / targetHeight);
                        sx = Math.trunc((img.width - canvasWidth) / 2);
                        sy = 0;
                    } else {
                        //原照片的高度超标按照宽度为基准计算高度
                        canvasHeight = Math.trunc(canvasWidth * targetHeight / targetWidth);
                        sx = 0;
                        sy = Math.trunc((img.height - canvasHeight) / 2);
                    }
                    this.ctx.drawImage(img
                        // , sx + offsetLeft, sy + offsetLeft
                        , sx, sy //在不修改裁剪区域的情况下图片略微有些拉伸
                        , canvasWidth, canvasHeight
                        , 0, 0
                        , targetWidth, targetHeight)
                }

                destWidth = targetWidth
                destHeight = targetHeight
            }

            let imgData = this.canvas.toDataURL();
            let that = this;
            // this.pics_resized = this.pics_resized.concat(imgData)
            // CBFunc(that.pics_org, that.pics_resized)
            this._resize({
                pic: imgData,
                width: 1200,
                quality: 0.5,
                success: function (data) {
                    that.upLoadBase64Pic(data.base64, function (res) {
                        console.log(res.d)

                        that.pics_resized = that.pics_resized.concat(res.d)
                        CBFunc(that.pics_org, that.pics_resized)
                    });
                }
            })


        }

    },
    upLoadBase64Pic: function (pic, cbFunc) {
        var formData = new FormData();   //这里连带form里的其他参数也一起提交了,如果不需要提交其他参数可以直接FormData无参数的构造函数
        //convertBase64UrlToBlob函数是将base64编码转换为Blob
        formData.append("Filedata", this.convertBase64UrlToBlob(pic));  //append函数的第一个参数是后台获取数据的参数名,和html标签的input的name属性功能相同
        //ajax提交form表单
        $.ajax({
            url: '/MyWebPicUpload',
            type: "POST",
            data: formData,
            dataType: "json",
            processData: false,         // 告诉jQuery不要去处理发送的数据
            contentType: false,        // 告诉jQuery不要去设置Content-Type请求头
            success: function (data) {
                //todo
                cbFunc(data)
            },
            xhr: function () {
                var xhr = new XMLHttpRequest();
                xhr.upload.addEventListener("progress", function (evt) {
                    if (evt.lengthComputable) {
                        var percentComplete = Math.round(evt.loaded * 100 / evt.total);
                        console.log("正在提交." + percentComplete.toString() + '%');
                    }
                }, false);
                return xhr;
            }

        });
    }

    , getData: function () {
        return this.pics_resized;
    }


    , reset: function () {
        this.pics_org = [];
        this.pics_resized = [];
    }

    , setSize: function (w, h) {
        this.targetW = w;
        this.targetH = h
        $("#firstCanvas").attr({
            width: this.targetW,
            height: this.targetH
        });

        this.canvas = document.getElementById('firstCanvas');
        this.ctx = this.canvas.getContext('2d');
    }


    , setSpace: function (l, r, t, b) {
        this.spaceLeft = l
        this.spaceRight = r
        this.spaceTop = t
        this.spaceBottom = b
    }
    , convertBase64UrlToBlob: function (urlData) {
        var bytes = window.atob(urlData.split(',')[1]);        //去掉url的头，并转换为byte
        //处理异常,将ascii码小于0的转换为大于0
        var ab = new ArrayBuffer(bytes.length);
        var ia = new Uint8Array(ab);
        for (var i = 0; i < bytes.length; i++) {
            ia[i] = bytes.charCodeAt(i);
        }
        return new Blob([ab], {type: 'image/png'});
    }
    /**
     * 获得base64
     * @param {Object} obj
     * @param {Number} [obj.pic] 图片地址或者base64shuju
     * @param {Number} [obj.width] 图片需要压缩的宽度，高度会跟随调整
     * @param {Number} [obj.quality=0.8] 压缩质量，不压缩为1
     * @param {Function} [obj.before(this, blob, file)] 处理前函数,this指向的是input:file
     * @param {Function} obj.success(obj) 处理后函数
     * @example
     *
     */
    , _resize: function (obj) {
        var img = new Image();
        img.src = obj.pic;
        // console.log(123);
        // console.log(obj.pic);
        img.onload = function () {
            console.log(11111222);

            var that = this;

            //生成比例
            var w = that.width,
                h = that.height,
                scale = w / h;
            w = obj.width || w;
            h = w / scale;

            //生成canvas
            var canvas = document.createElement('canvas');
            var ctx = canvas.getContext('2d');
            $(canvas).attr({
                width: w,
                height: h
            });
            ctx.drawImage(that, 0, 0, w, h);

            /**
             * 生成base64
             * 兼容修复移动设备需要引入mobileBUGFix.js
             */
            var base64 = canvas.toDataURL('image/jpeg', obj.quality || 0.8);

            // 修复IOS
            if (navigator.userAgent.match(/iphone/i)) {
                var mpImg = new MegaPixImage(img);
                mpImg.render(canvas, {
                    maxWidth: w,
                    maxHeight: h,
                    quality: obj.quality || 0.8
                });
                base64 = canvas.toDataURL('image/jpeg', obj.quality || 0.8);
            }

            // 修复android
            if (navigator.userAgent.match(/Android/i)) {
                var encoder = new JPEGEncoder();
                base64 = encoder.encode(ctx.getImageData(0, 0, w, h), obj.quality * 100 || 80);
            }

            // 生成结果
            var result = {
                base64: base64,
                clearBase64: base64.substr(base64.indexOf(',') + 1)
            };
            // return result;
            // 执行后函数
            console.log(result);
            obj.success(result);
        };
    }
    , dealWithOne: function (_this, picPath, cbFunc) {
        this.pics_org = [picPath];
        this.pics_resized = [];
        let img = new Image();
        let that = this;
        img.onload = function () {

            that._compress(_this, cbFunc,this)
        }

        img.src = picPath
    }

}

/* jpeg_encoder_basic.js  for android jpeg压缩质量修复 */
function JPEGEncoder(a) {
    function I(a) {
        var c, i, j, k, l, m, n, o, p,
            b = [16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19, 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56, 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56, 68, 109, 103, 77, 24, 35, 55, 64, 81, 104, 113, 92, 49, 64, 78, 87, 103, 121, 120, 101, 72, 92, 95, 98, 112, 100, 103, 99];
        for (c = 0; 64 > c; c++) i = d((b[c] * a + 50) / 100), 1 > i ? i = 1 : i > 255 && (i = 255), e[z[c]] = i;
        for (j = [17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66, 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99, 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99], k = 0; 64 > k; k++) l = d((j[k] * a + 50) / 100), 1 > l ? l = 1 : l > 255 && (l = 255), f[z[k]] = l;
        for (m = [1, 1.387039845, 1.306562965, 1.175875602, 1, .785694958, .5411961, .275899379], n = 0, o = 0; 8 > o; o++) for (p = 0; 8 > p; p++) g[n] = 1 / (8 * e[z[n]] * m[o] * m[p]), h[n] = 1 / (8 * f[z[n]] * m[o] * m[p]), n++
    }

    function J(a, b) {
        var f, g, c = 0, d = 0, e = new Array;
        for (f = 1; 16 >= f; f++) {
            for (g = 1; g <= a[f]; g++) e[b[d]] = [], e[b[d]][0] = c, e[b[d]][1] = f, d++, c++;
            c *= 2
        }
        return e
    }

    function K() {
        i = J(A, B), j = J(E, F), k = J(C, D), l = J(G, H)
    }

    function L() {
        var c, d, e, a = 1, b = 2;
        for (c = 1; 15 >= c; c++) {
            for (d = a; b > d; d++) n[32767 + d] = c, m[32767 + d] = [], m[32767 + d][1] = c, m[32767 + d][0] = d;
            for (e = -(b - 1); -a >= e; e++) n[32767 + e] = c, m[32767 + e] = [], m[32767 + e][1] = c, m[32767 + e][0] = b - 1 + e;
            a <<= 1, b <<= 1
        }
    }

    function M() {
        for (var a = 0; 256 > a; a++) x[a] = 19595 * a, x[a + 256 >> 0] = 38470 * a, x[a + 512 >> 0] = 7471 * a + 32768, x[a + 768 >> 0] = -11059 * a, x[a + 1024 >> 0] = -21709 * a, x[a + 1280 >> 0] = 32768 * a + 8421375, x[a + 1536 >> 0] = -27439 * a, x[a + 1792 >> 0] = -5329 * a
    }

    function N(a) {
        for (var b = a[0], c = a[1] - 1; c >= 0;) b & 1 << c && (r |= 1 << s), c--, s--, 0 > s && (255 == r ? (O(255), O(0)) : O(r), s = 7, r = 0)
    }

    function O(a) {
        q.push(w[a])
    }

    function P(a) {
        O(255 & a >> 8), O(255 & a)
    }

    function Q(a, b) {
        var c, d, e, f, g, h, i, j, l, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P,
            Q, R, S, T, U, V, W, X, Y, Z, $, _, k = 0;
        const m = 8, n = 64;
        for (l = 0; m > l; ++l) c = a[k], d = a[k + 1], e = a[k + 2], f = a[k + 3], g = a[k + 4], h = a[k + 5], i = a[k + 6], j = a[k + 7], p = c + j, q = c - j, r = d + i, s = d - i, t = e + h, u = e - h, v = f + g, w = f - g, x = p + v, y = p - v, z = r + t, A = r - t, a[k] = x + z, a[k + 4] = x - z, B = .707106781 * (A + y), a[k + 2] = y + B, a[k + 6] = y - B, x = w + u, z = u + s, A = s + q, C = .382683433 * (x - A), D = .5411961 * x + C, E = 1.306562965 * A + C, F = .707106781 * z, G = q + F, H = q - F, a[k + 5] = H + D, a[k + 3] = H - D, a[k + 1] = G + E, a[k + 7] = G - E, k += 8;
        for (k = 0, l = 0; m > l; ++l) c = a[k], d = a[k + 8], e = a[k + 16], f = a[k + 24], g = a[k + 32], h = a[k + 40], i = a[k + 48], j = a[k + 56], I = c + j, J = c - j, K = d + i, L = d - i, M = e + h, N = e - h, O = f + g, P = f - g, Q = I + O, R = I - O, S = K + M, T = K - M, a[k] = Q + S, a[k + 32] = Q - S, U = .707106781 * (T + R), a[k + 16] = R + U, a[k + 48] = R - U, Q = P + N, S = N + L, T = L + J, V = .382683433 * (Q - T), W = .5411961 * Q + V, X = 1.306562965 * T + V, Y = .707106781 * S, Z = J + Y, $ = J - Y, a[k + 40] = $ + W, a[k + 24] = $ - W, a[k + 8] = Z + X, a[k + 56] = Z - X, k++;
        for (l = 0; n > l; ++l) _ = a[l] * b[l], o[l] = _ > 0 ? 0 | _ + .5 : 0 | _ - .5;
        return o
    }

    function R() {
        P(65504), P(16), O(74), O(70), O(73), O(70), O(0), O(1), O(1), O(0), P(1), P(1), O(0), O(0)
    }

    function S(a, b) {
        P(65472), P(17), O(8), P(b), P(a), O(3), O(1), O(17), O(0), O(2), O(17), O(1), O(3), O(17), O(1)
    }

    function T() {
        var a, b;
        for (P(65499), P(132), O(0), a = 0; 64 > a; a++) O(e[a]);
        for (O(1), b = 0; 64 > b; b++) O(f[b])
    }

    function U() {
        var a, b, c, d, e, f, g, h;
        for (P(65476), P(418), O(0), a = 0; 16 > a; a++) O(A[a + 1]);
        for (b = 0; 11 >= b; b++) O(B[b]);
        for (O(16), c = 0; 16 > c; c++) O(C[c + 1]);
        for (d = 0; 161 >= d; d++) O(D[d]);
        for (O(1), e = 0; 16 > e; e++) O(E[e + 1]);
        for (f = 0; 11 >= f; f++) O(F[f]);
        for (O(17), g = 0; 16 > g; g++) O(G[g + 1]);
        for (h = 0; 161 >= h; h++) O(H[h])
    }

    function V() {
        P(65498), P(12), O(3), O(1), O(0), O(2), O(17), O(3), O(17), O(0), O(63), O(0)
    }

    function W(a, b, c, d, e) {
        var h, l, o, q, r, s, t, u, v, w, f = e[0], g = e[240];
        const i = 16, j = 63, k = 64;
        for (l = Q(a, b), o = 0; k > o; ++o) p[z[o]] = l[o];
        for (q = p[0] - c, c = p[0], 0 == q ? N(d[0]) : (h = 32767 + q, N(d[n[h]]), N(m[h])), r = 63; r > 0 && 0 == p[r]; r--) ;
        if (0 == r) return N(f), c;
        for (s = 1; r >= s;) {
            for (u = s; 0 == p[s] && r >= s; ++s) ;
            if (v = s - u, v >= i) {
                for (t = v >> 4, w = 1; t >= w; ++w) N(g);
                v = 15 & v
            }
            h = 32767 + p[s], N(e[(v << 4) + n[h]]), N(m[h]), s++
        }
        return r != j && N(f), c
    }

    function X() {
        var b, a = String.fromCharCode;
        for (b = 0; 256 > b; b++) w[b] = a(b)
    }

    function Y(a) {
        if (0 >= a && (a = 1), a > 100 && (a = 100), y != a) {
            var b = 0;
            b = 50 > a ? Math.floor(5e3 / a) : Math.floor(200 - 2 * a), I(b), y = a, console.log("Quality set to: " + a + "%")
        }
    }

    function Z() {
        var c, b = (new Date).getTime();
        a || (a = 50), X(), K(), L(), M(), Y(a), c = (new Date).getTime() - b, console.log("Initialization " + c + "ms")
    }

    var d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H;
    Math.round, d = Math.floor, e = new Array(64), f = new Array(64), g = new Array(64), h = new Array(64), m = new Array(65535), n = new Array(65535), o = new Array(64), p = new Array(64), q = [], r = 0, s = 7, t = new Array(64), u = new Array(64), v = new Array(64), w = new Array(256), x = new Array(2048), z = [0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42, 3, 8, 12, 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, 10, 19, 23, 32, 39, 45, 52, 54, 20, 22, 33, 38, 46, 51, 55, 60, 21, 34, 37, 47, 50, 56, 59, 61, 35, 36, 48, 49, 57, 58, 62, 63], A = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], B = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], C = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125], D = [1, 2, 3, 0, 4, 17, 5, 18, 33, 49, 65, 6, 19, 81, 97, 7, 34, 113, 20, 50, 129, 145, 161, 8, 35, 66, 177, 193, 21, 82, 209, 240, 36, 51, 98, 114, 130, 9, 10, 22, 23, 24, 25, 26, 37, 38, 39, 40, 41, 42, 52, 53, 54, 55, 56, 57, 58, 67, 68, 69, 70, 71, 72, 73, 74, 83, 84, 85, 86, 87, 88, 89, 90, 99, 100, 101, 102, 103, 104, 105, 106, 115, 116, 117, 118, 119, 120, 121, 122, 131, 132, 133, 134, 135, 136, 137, 138, 146, 147, 148, 149, 150, 151, 152, 153, 154, 162, 163, 164, 165, 166, 167, 168, 169, 170, 178, 179, 180, 181, 182, 183, 184, 185, 186, 194, 195, 196, 197, 198, 199, 200, 201, 202, 210, 211, 212, 213, 214, 215, 216, 217, 218, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250], E = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], F = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], G = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119], H = [0, 1, 2, 3, 17, 4, 5, 33, 49, 6, 18, 65, 81, 7, 97, 113, 19, 34, 50, 129, 8, 20, 66, 145, 161, 177, 193, 9, 35, 51, 82, 240, 21, 98, 114, 209, 10, 22, 36, 52, 225, 37, 241, 23, 24, 25, 26, 38, 39, 40, 41, 42, 53, 54, 55, 56, 57, 58, 67, 68, 69, 70, 71, 72, 73, 74, 83, 84, 85, 86, 87, 88, 89, 90, 99, 100, 101, 102, 103, 104, 105, 106, 115, 116, 117, 118, 119, 120, 121, 122, 130, 131, 132, 133, 134, 135, 136, 137, 138, 146, 147, 148, 149, 150, 151, 152, 153, 154, 162, 163, 164, 165, 166, 167, 168, 169, 170, 178, 179, 180, 181, 182, 183, 184, 185, 186, 194, 195, 196, 197, 198, 199, 200, 201, 202, 210, 211, 212, 213, 214, 215, 216, 217, 218, 226, 227, 228, 229, 230, 231, 232, 233, 234, 242, 243, 244, 245, 246, 247, 248, 249, 250], this.encode = function (a, b) {
        var d, e, f, m, n, o, p, y, z, A, B, C, D, E, F, G, H, I, J, K, c = (new Date).getTime();
        for (b && Y(b), q = new Array, r = 0, s = 7, P(65496), R(), T(), S(a.width, a.height), U(), V(), d = 0, e = 0, f = 0, r = 0, s = 7, this.encode.displayName = "_encode_", m = a.data, n = a.width, o = a.height, p = 4 * n, z = 0; o > z;) {
            for (y = 0; p > y;) {
                for (D = p * z + y, E = D, F = -1, G = 0, H = 0; 64 > H; H++) G = H >> 3, F = 4 * (7 & H), E = D + G * p + F, z + G >= o && (E -= p * (z + 1 + G - o)), y + F >= p && (E -= y + F - p + 4), A = m[E++], B = m[E++], C = m[E++], t[H] = (x[A] + x[B + 256 >> 0] + x[C + 512 >> 0] >> 16) - 128, u[H] = (x[A + 768 >> 0] + x[B + 1024 >> 0] + x[C + 1280 >> 0] >> 16) - 128, v[H] = (x[A + 1280 >> 0] + x[B + 1536 >> 0] + x[C + 1792 >> 0] >> 16) - 128;
                d = W(t, g, d, i, k), e = W(u, h, e, j, l), f = W(v, h, f, j, l), y += 32
            }
            z += 8
        }
        return s >= 0 && (I = [], I[1] = s + 1, I[0] = (1 << s + 1) - 1, N(I)), P(65497), J = "data:image/jpeg;base64," + btoa(q.join("")), q = [], K = (new Date).getTime() - c, console.log("Encoding time: " + K + "ms"), J
    }, Z()
}

function getImageDataFromImage(a) {
    var d, b = "string" == typeof a ? document.getElementById(a) : a, c = document.createElement("canvas");
    return c.width = b.width, c.height = b.height, d = c.getContext("2d"), d.drawImage(b, 0, 0), d.getImageData(0, 0, c.width, c.height)
}

/* megapix-image.js for IOS(iphone5+) drawImage画面扭曲修复  */
!function () {
    function a(a) {
        var d, e, b = a.naturalWidth, c = a.naturalHeight;
        return b * c > 1048576 ? (d = document.createElement("canvas"), d.width = d.height = 1, e = d.getContext("2d"), e.drawImage(a, -b + 1, 0), 0 === e.getImageData(0, 0, 1, 1).data[3]) : !1
    }

    function b(a, b, c) {
        var e, f, g, h, i, j, k, d = document.createElement("canvas");
        for (d.width = 1, d.height = c, e = d.getContext("2d"), e.drawImage(a, 0, 0), f = e.getImageData(0, 0, 1, c).data, g = 0, h = c, i = c; i > g;) j = f[4 * (i - 1) + 3], 0 === j ? h = i : g = i, i = h + g >> 1;
        return k = i / c, 0 === k ? 1 : k
    }

    function c(a, b, c) {
        var e = document.createElement("canvas");
        return d(a, e, b, c), e.toDataURL("image/jpeg", b.quality || .8)
    }

    function d(c, d, f, g) {
        var m, n, o, p, q, r, s, t, u, v, w, h = c.naturalWidth, i = c.naturalHeight, j = f.width, k = f.height,
            l = d.getContext("2d");
        for (l.save(), e(d, l, j, k, f.orientation), m = a(c), m && (h /= 2, i /= 2), n = 1024, o = document.createElement("canvas"), o.width = o.height = n, p = o.getContext("2d"), q = g ? b(c, h, i) : 1, r = Math.ceil(n * j / h), s = Math.ceil(n * k / i / q), t = 0, u = 0; i > t;) {
            for (v = 0, w = 0; h > v;) p.clearRect(0, 0, n, n), p.drawImage(c, -v, -t), l.drawImage(o, 0, 0, n, n, w, u, r, s), v += n, w += r;
            t += n, u += s
        }
        l.restore(), o = p = null
    }

    function e(a, b, c, d, e) {
        switch (e) {
            case 5:
            case 6:
            case 7:
            case 8:
                a.width = d, a.height = c;
                break;
            default:
                a.width = c, a.height = d
        }
        switch (e) {
            case 2:
                b.translate(c, 0), b.scale(-1, 1);
                break;
            case 3:
                b.translate(c, d), b.rotate(Math.PI);
                break;
            case 4:
                b.translate(0, d), b.scale(1, -1);
                break;
            case 5:
                b.rotate(.5 * Math.PI), b.scale(1, -1);
                break;
            case 6:
                b.rotate(.5 * Math.PI), b.translate(0, -d);
                break;
            case 7:
                b.rotate(.5 * Math.PI), b.translate(c, -d), b.scale(-1, 1);
                break;
            case 8:
                b.rotate(-.5 * Math.PI), b.translate(-c, 0)
        }
    }

    function f(a) {
        var b, c, d;
        if (window.Blob && a instanceof Blob) {
            if (b = new Image, c = window.URL && window.URL.createObjectURL ? window.URL : window.webkitURL && window.webkitURL.createObjectURL ? window.webkitURL : null, !c) throw Error("No createObjectURL function found to create blob url");
            b.src = c.createObjectURL(a), this.blob = a, a = b
        }
        a.naturalWidth || a.naturalHeight || (d = this, a.onload = function () {
            var b, c, a = d.imageLoadListeners;
            if (a) for (d.imageLoadListeners = null, b = 0, c = a.length; c > b; b++) a[b]()
        }, this.imageLoadListeners = []), this.srcImage = a
    }

    f.prototype.render = function (a, b, e) {
        var f, g, h, i, j, k, l, m, n, o, p;
        if (this.imageLoadListeners) return f = this, this.imageLoadListeners.push(function () {
            f.render(a, b, e)
        }), void 0;
        b = b || {}, g = this.srcImage.naturalWidth, h = this.srcImage.naturalHeight, i = b.width, j = b.height, k = b.maxWidth, l = b.maxHeight, m = !this.blob || "image/jpeg" === this.blob.type, i && !j ? j = h * i / g << 0 : j && !i ? i = g * j / h << 0 : (i = g, j = h), k && i > k && (i = k, j = h * i / g << 0), l && j > l && (j = l, i = g * j / h << 0), n = {
            width: i,
            height: j
        };
        for (o in b) n[o] = b[o];
        p = a.tagName.toLowerCase(), "img" === p ? a.src = c(this.srcImage, n, m) : "canvas" === p && d(this.srcImage, a, n, m), "function" == typeof this.onrender && this.onrender(a), e && e()
    }, "function" == typeof define && define.amd ? define([], function () {
        return f
    }) : this.MegaPixImage = f
}();

// function convertBase64UrlToBlob(urlData){
//     var bytes=window.atob(urlData.split(',')[1]);        //去掉url的头，并转换为byte
//     //处理异常,将ascii码小于0的转换为大于0
//     var ab = new ArrayBuffer(bytes.length);
//     var ia = new Uint8Array(ab);
//     for (var i = 0; i < bytes.length; i++) {ia[i] = bytes.charCodeAt(i);}
//     return new Blob( [ab] , {type : 'image/png'});
// }
//
// module.exports = {
//     pickAndResize,
//     getData,
//     reset,
//     setSize,
//     setSpace,
//     setCut,
// }